package br.com.puertorico.mecanismos.ui.tags;

import javax.faces.component.UIComponent;
import javax.faces.view.facelets.FaceletContext;
import javax.faces.view.facelets.TagAttribute;
import javax.faces.view.facelets.TagConfig;
import javax.faces.view.facelets.TagHandler;

/**
 * Esta classe representa a tag
 * <code><al:initAttribute var="x" value="y" force="false" /></code>, que faz a
 * inicializa&ccedil;&atilde;o dos atributos que n&atilde;o foram passados pelo
 * cliente da tag customizada. Esta tag tem por objetivo auxiliar o
 * desenvolvimento de <i>custom tags</i> evitando c&oacute;digo repetitivo.
 */
public final class InitAttributeHandler extends TagHandler {

	private final TagAttribute var;

	private final TagAttribute value;

	private final TagAttribute force;

	/**
	 * Construtor default.
	 */
	public InitAttributeHandler(final TagConfig config) {
		super(config);
		this.var = this.getRequiredAttribute("var");
		this.value = this.getRequiredAttribute("value");
		this.force = this.getAttribute("force");
	}

	/**
	 * @see com.sun.facelets.FaceletHandler#apply(com.sun.facelets.FaceletContext,
	 *      javax.faces.component.UIComponent)
	 */
	public void apply(final FaceletContext faceletsContext,
			final UIComponent parent) {
		final String tvar = this.var.getValue(faceletsContext);
		final Object tvarValue = faceletsContext.getAttribute(tvar);

		boolean force = false;
		if (this.force != null) {
			final String tforce = this.force.getValue(faceletsContext);
			if (tforce != null) {
				force = Boolean.parseBoolean(tforce);
			}
		}

		if (tvarValue == null || force) {
			String tdefaultVar = this.value.getValue(faceletsContext);
			faceletsContext.setAttribute(tvar, tdefaultVar);
		}
	}
}
